package com.generic.trouble;

/**继续复用我们上面的Node的类，对于泛型代码，Java编译器实际上还会偷偷帮我们实现一个Bridge method。
 *
 * 你可能会认为在类型擦除后，编译器会将Node和MyNode变成下面这样：
public class Node {

    public Object data;

    public Node(Object data) { this.data = data; }

    public void setData(Object data) {

        System.out.println("Node.setData");

        this.data = data;

    }

}
public class MyNode extends Node {

    public MyNode(Integer data) { super(data); }

    public void setData(Integer data) {

        System.out.println("MyNode.setData");

        super.setData(data);

    }

}
实际上Java编译器对上面代码自动还做了一个处理：
class MyNode extends Node {

    // Bridge method generated by the compiler

    public void setData(Object data) {

        setData((Integer) data);

    }

    public void setData(Integer data) {

        System.out.println("MyNode.setData");

        super.setData(data);

    }

    // ...

}
这也就是为什么上面会报错的原因了，setData((Integer) data);的时候String无法转换成Integer。所以上面第2行编译器提示unchecked warning的时候，我们不能选择忽略，不然要等到运行期间才能发现异常。如果我们一开始加上Node<Integer> n = mn就好了，这样编译器就可以提前帮我们发现错误。
 * @author DELL
 *
 */
public class Demo2 {

	public static void main(String[] args) {
		MyNode mn = new MyNode(5);
		Node n = mn; // A raw type - compiler throws an unchecked warning
		n.setData("Hello"); // Causes a ClassCastException to be thrown.
	}

}

class Node<T> {

    public T data;

    public Node(T data) { this.data = data; }

    public void setData(T data) {

        System.out.println("Node.setData");

        this.data = data;

    }

}

class MyNode extends Node<Integer> {

    public MyNode(Integer data) { super(data); }

    public void setData(Integer data) {

        System.out.println("MyNode.setData");

        super.setData(data);

    }

}